package code12._type;

import org.junit.Test;

public class TestClass {
	@Test
	public void f1() {
		Product p1 = new Product();
		// 使用 Object 时，
		// 1.可以接收任意类型的值
		//p1.price = 10;
		p1.price = "10";
		//p1.price = 10.98D;
		
		// 2.取值时，需要强制转换类型, 可能会出现 类型转换异常
		double price = (Double) p1.price;
		System.out.println("price:"+price);
	}
	@Test
	public void f2() {
		// 不传入泛型时，默认为 Object
		Produtc2 p2 = new Produtc2();
		p2.price = 10;
		// 在类名后, 使用 <具体类型名> 指定对应泛型变量 实际对应的类型
		// 基本数据类型 不能用作 泛型的类型，如果需要使用，则使用对应的包装类型
		Produtc2<Double> p3 = new Produtc2<Double>();
		// 上述的意思是 p3 对象中的 T 表示的 是 Double
		//p3.price = "10";// 会有类型检测
		p3.price = 10D;
		// 取值
		//String price = p3.price;//// 会有类型检测
		Double price = p3.price;
		System.out.println("price:"+price);
		System.out.println("---------");
		
		Produtc2<String> p4 = new Produtc2<String>();
		// 上述的意思是 p4 对象中的 T 表示的 是 String
		p4.price = "10.98元";
		String s = p4.price;
		System.out.println("s:" + s);
	}
}
class Product {
	// 类型不确定(未知)
	// 在没有泛型时(泛型时JDK5新增的)，通过Object来实现，存在类型安全问题
	public Object price;
}
// 泛型类
class Produtc2<T> {
	// 表示当前类中有一个 类型，名称是 T, 表示未知的类型
	// 类型不确定(未知)
	public T price;
	// 泛型是 编译器提供的 语法糖，只在编译时期有效，编译后，class 中使用的是 Object。
}
